#---
# Excerpted from "Agile Web Development with Rails, 3rd Ed.",
# published by The Pragmatic Bookshelf.
# Copyrights apply to this code. It may not be used to create training material, 
# courses, books, articles, and the like. Contact us if you are in doubt.
# We make no guarantees that this code is fit for any purpose. 
# Visit http://www.pragmaticprogrammer.com/titles/rails3 for more book information.
#---
class StoreController < ApplicationController
  def index
    if session[:counter].nil?
      session[:counter] = 1
    else session[:counter] +=1
    end
    @products = Product.find_products_for_sale
    @cart = find_cart
  end
  
  def add_to_cart
    begin
      product = Product.find(params[:id]) 
    rescue ActiveRecord::RecordNotFound
      logger.error("Attempt to access invalid product #{params[:id]}")
      redirect_to_index("Invalid product ID")
    else
      @cart = find_cart
      @current_item = @cart.add_product(product) 
      if request.xhr?                 
        respond_to { |format| format.js }
      else redirect_to_index
      end
    end       
  end
  
  def empty_cart
    session[:cart] = nil
    if request.xhr?
      respond_to { |format| format.js}
    else redirect_to_index
    end
  end
  
  def remove_from_cart
    begin
      product = Product.find(params[:id])
      rescue ActiveRecord::RecordNotFound
        logger.error("Attempt to remove invalid product #{params[:id]}")
        redirect_to_index("Invalid product ID")
      else
      @cart = find_cart
      @current_item = @cart.items.find {|item| item.product == product}
        if  !@current_item || @current_item.quantity == 0
          redirect_to_index("Sorry, there's no such product in your shopping cart")
        else
          @cart.remove_product(product)
          if request.xhr?
              respond_to { |format| format.js}
          else
            redirect_to_index
          end
        end
      end
    end
    
  def  redirect_to_index(msg = nil)
    flash[:notice] = msg
    redirect_to :action => :index
  end
  
  def checkout
    @cart = find_cart
    if @cart.items.empty?
      redirect_to_index("Your cart is empty" )
    else
      @order = Order.new
    end
  end
  
  def save_order
    @cart = find_cart
    @order = Order.new(params[:order])
    @order.add_line_items_from_cart(@cart)
    if @order.save
      session[:cart] = nil
      redirect_to_index("Thank you for your order" )
    else
      render :action => :checkout
    end
  end

private

  def find_cart
    session[:cart] ||= Cart.new
  end

end
